package com.zishuimuyu.http;

import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

/**
 * 抽象类，实现了 HttpParams 接口，用于处理 HTTP 请求参数
 */
public abstract class AbstractHttpParams implements HttpParams {
    // 用于存储 HTTP 请求参数的映射，键和值都是字符串类型
    protected final Map<String, String> params = new HashMap<>();

    /**
     * 向参数映射中添加一个键值对
     *
     * @param key   参数的键
     * @param value 参数的值
     * @return 返回当前对象，以便支持链式调用
     */
    @Override
    public HttpParams put(String key, String value) {
        // 将键值对添加到参数映射中
        params.put(key, value);
        // 返回当前对象
        return this;
    }

    /**
     * 发送 HTTP 请求并将响应内容作为字符串返回
     *
     * @param baseUrl 请求的基础 URL
     * @return 响应内容的字符串表示
     * @throws Exception 如果请求过程中发生异常
     */
    @Override
    public String send2String(String baseUrl) throws Exception {
        // 创建一个默认的可关闭的 HTTP 客户端
        CloseableHttpClient httpClient = HttpClients.createDefault();
        try {
            // 调用抽象方法 send 发送请求并获取响应
            CloseableHttpResponse response = send(httpClient, baseUrl);
            // 将响应实体内容转换为字符串并返回
            return EntityUtils.toString(response.getEntity());
        } finally {
            // 确保无论是否发生异常，都关闭 HTTP 客户端
            httpClient.close();
        }
    }

    /**
     * 发送 HTTP 请求并将响应内容作为输入流返回
     *
     * @param baseUrl 请求的基础 URL
     * @return 响应内容的输入流
     * @throws Exception 如果请求过程中发生异常
     */
    @Override
    public InputStream send2InputStream(String baseUrl) throws Exception {
        // 创建一个默认的可关闭的 HTTP 客户端
        CloseableHttpClient httpClient = HttpClients.createDefault();
        try {
            // 调用抽象方法 send 发送请求并获取响应
            CloseableHttpResponse response = send(httpClient, baseUrl);
            // 获取响应实体的输入流并返回
            return response.getEntity().getContent();
        } finally {
            // 确保无论是否发生异常，都关闭 HTTP 客户端
            httpClient.close();
        }
    }

    /**
     * 抽象方法，用于发送 HTTP 请求并返回响应
     *
     * @param httpClient 可关闭的 HTTP 客户端
     * @param baseUrl    请求的基础 URL
     * @return 响应对象
     * @throws Exception 如果请求过程中发生异常
     */
    abstract protected CloseableHttpResponse send(CloseableHttpClient httpClient, String baseUrl) throws Exception;
}
